home *** CD-ROM | disk | FTP | other *** search
/ Introduction to 3D Game …ogramming with DirectX 12 / Introduction-to-3D-Game-Programming-with-DirectX-12.ISO / Code.Textures / Chapter 4 Direct3D Initialization / Init Direct3D / InitDirect3DApp.cpp < prev   
C/C++ Source or Header  |  2016-03-02  |  4KB  |  124 lines

  1. //***************************************************************************************
  2. // Init Direct3D.cpp by Frank Luna (C) 2015 All Rights Reserved.
  3. //
  4. // Demonstrates the sample framework by initializing Direct3D, clearing 
  5. // the screen, and displaying frame stats.
  6. //
  7. //***************************************************************************************
  8.  
  9. #include "../../Common/d3dApp.h"
  10. #include <DirectXColors.h>
  11.  
  12. using namespace DirectX;
  13.  
  14. class InitDirect3DApp : public D3DApp
  15. {
  16. public:
  17.     InitDirect3DApp(HINSTANCE hInstance);
  18.     ~InitDirect3DApp();
  19.  
  20.     virtual bool Initialize()override;
  21.  
  22. private:
  23.     virtual void OnResize()override;
  24.     virtual void Update(const GameTimer& gt)override;
  25.     virtual void Draw(const GameTimer& gt)override;
  26.  
  27. };
  28.  
  29. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance,
  30.                    PSTR cmdLine, int showCmd)
  31. {
  32.     // Enable run-time memory check for debug builds.
  33. #if defined(DEBUG) | defined(_DEBUG)
  34.     _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
  35. #endif
  36.  
  37.     try
  38.     {
  39.         InitDirect3DApp theApp(hInstance);
  40.         if(!theApp.Initialize())
  41.             return 0;
  42.  
  43.         return theApp.Run();
  44.     }
  45.     catch(DxException& e)
  46.     {
  47.         MessageBox(nullptr, e.ToString().c_str(), L"HR Failed", MB_OK);
  48.         return 0;
  49.     }
  50. }
  51.  
  52. InitDirect3DApp::InitDirect3DApp(HINSTANCE hInstance)
  53. : D3DApp(hInstance) 
  54. {
  55. }
  56.  
  57. InitDirect3DApp::~InitDirect3DApp()
  58. {
  59. }
  60.  
  61. bool InitDirect3DApp::Initialize()
  62. {
  63.     if(!D3DApp::Initialize())
  64.         return false;
  65.         
  66.     return true;
  67. }
  68.  
  69. void InitDirect3DApp::OnResize()
  70. {
  71.     D3DApp::OnResize();
  72. }
  73.  
  74. void InitDirect3DApp::Update(const GameTimer& gt)
  75. {
  76.  
  77. }
  78.  
  79. void InitDirect3DApp::Draw(const GameTimer& gt)
  80. {
  81.     // Reuse the memory associated with command recording.
  82.     // We can only reset when the associated command lists have finished execution on the GPU.
  83.     ThrowIfFailed(mDirectCmdListAlloc->Reset());
  84.  
  85.     // A command list can be reset after it has been added to the command queue via ExecuteCommandList.
  86.     // Reusing the command list reuses memory.
  87.     ThrowIfFailed(mCommandList->Reset(mDirectCmdListAlloc.Get(), nullptr));
  88.  
  89.     // Indicate a state transition on the resource usage.
  90.     mCommandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(CurrentBackBuffer(),
  91.         D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET));
  92.  
  93.     // Set the viewport and scissor rect.  This needs to be reset whenever the command list is reset.
  94.     mCommandList->RSSetViewports(1, &mScreenViewport);
  95.     mCommandList->RSSetScissorRects(1, &mScissorRect);
  96.  
  97.     // Clear the back buffer and depth buffer.
  98.     mCommandList->ClearRenderTargetView(CurrentBackBufferView(), Colors::LightSteelBlue, 0, nullptr);
  99.     mCommandList->ClearDepthStencilView(DepthStencilView(), D3D12_CLEAR_FLAG_DEPTH | D3D12_CLEAR_FLAG_STENCIL, 1.0f, 0, 0, nullptr);
  100.     
  101.     // Specify the buffers we are going to render to.
  102.     mCommandList->OMSetRenderTargets(1, &CurrentBackBufferView(), true, &DepthStencilView());
  103.     
  104.     // Indicate a state transition on the resource usage.
  105.     mCommandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(CurrentBackBuffer(),
  106.         D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT));
  107.  
  108.     // Done recording commands.
  109.     ThrowIfFailed(mCommandList->Close());
  110.  
  111.     // Add the command list to the queue for execution.
  112.     ID3D12CommandList* cmdsLists[] = { mCommandList.Get() };
  113.     mCommandQueue->ExecuteCommandLists(_countof(cmdsLists), cmdsLists);
  114.     
  115.     // swap the back and front buffers
  116.     ThrowIfFailed(mSwapChain->Present(0, 0));
  117.     mCurrBackBuffer = (mCurrBackBuffer + 1) % SwapChainBufferCount;
  118.  
  119.     // Wait until frame commands are complete.  This waiting is inefficient and is
  120.     // done for simplicity.  Later we will show how to organize our rendering code
  121.     // so we do not have to wait per frame.
  122.     FlushCommandQueue();
  123. }
  124.